package com.jyniubi.gmail.item.config;

import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.*;

@Configuration
public class ThreadPoolConfig {
    @Bean
    public ExecutorService executorService(
            @Value("${threadPool.corePoolSize}") Integer corePoolSize,
            @Value("${threadPool.maximumPoolSize}") Integer maximumPoolSize,
            @Value("${threadPool.keepAliveTime}") Integer keepAliveTime,
            @Value("${threadPool.blockingQueueSize}") Integer blockingQueueSize

    ){
        //为了方便监控和排查问题，可以为线程池设置一个有意义的名称。可以使用 ThreadFactory 来为线程池中的线程命名。
        ThreadFactory threadFactory = new ThreadFactoryBuilder()
                .setNameFormat("item-thread-pool-%d")
                .build();
        // 拒绝策略使用默认的
        // 1.AbortPolicy，即当队列满且线程数达到最大线程数时，新任务会被拒绝并抛出异常
        // 其他三种拒绝策略
        // 2.CallerRunsPolicy：由提交任务的线程直接执行该任务。
        // 3.DiscardPolicy：直接丢弃新任务。
        // 4.DiscardOldestPolicy：丢弃队列中最旧的任务，然后尝试提交新任务。
        return new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime, TimeUnit.MINUTES,new ArrayBlockingQueue<>(blockingQueueSize),threadFactory);
    }
}
